#define _CRT_SECURE_NO_WARNINGS 1
/*
	strstr函数模拟实现
				char* strstr ( const char *, const char * );

				NULL ->空指针
				NUL / Null ->'\0'

				while(str==0)	->		while(!str)				->str等于0 则进入循环
				while(str!=0)	->		while(str)				->str不等于0 则进入循环
				while(p1==p2)	->		while(!(p1-p2))		    ->p1等于p2 则进入循环
				while(p1!=p2)	->		while(p1-p2)			->p1不等于p2 则进入循环
*/
#include<stdio.h>
#include<assert.h>
char* my_strstr(const char* str1, const char* str2)
{
	assert(str1&&str2);			//保证指针有效性
	char* cur = (char*)str1;
	char* p1 = NULL;
	char* p2 = NULL;

	if (!*str2)										//str2=='\0'时执行
	{
		return ((char*)str1);						//需要强制类型转换，因为返回值为char*类型，与const  char*不匹配
	}
	while (*cur)
	{
		p1 = cur;
		p2 = (char*)str2;							//这两部至关重要，为还没查找完并且还没查找到时为指针做重置回归处理。
													//所以这也是为什么另外设置两个指针，而不动str1,str2指针的原因。如果动了，则找不到起始的位置。
		while (*p1 && *p2 && !(*p1 - *p2))
		{											//*p1=='\0' ->没有查找到  *p2=='\0' ->查找到子串
			p1++;									//*p1走到'\0'说明没有查找到，
			p2++;									//如果*p1!=*p2 则让p1马上回归初始位置并让初始位置往前走一步,p2马上回归起始位置，起始位置不动
		}
		if (!*p2)
		{
			return cur;				//找到子串
		}
		cur++;
	}

	return NULL;					//没找到子串
}